#pragma once

namespace MockItNow
{
	template<typename T>
	struct IsReference
	{
		enum { Value = false };
	};

	template<typename T>
	struct IsReference<T&>
	{
		enum { Value = true };
	};

	template<typename T>
	struct IsPointer
	{
		enum { Value = false };
	};

	template<typename T>
	struct IsPointer<T*>
	{
		enum { Value = true };
	};

	template<typename T>
	struct IsValue
	{
		enum { Value = true };
	};

	template<typename T>
	struct IsValue<T&>
	{
		enum { Value = false };
	};

	template<typename T>
	struct IsValue<T*>
	{
		enum { Value = false };
	};

	template<typename T>
	struct IsConst
	{
		enum { Value = false };
	};

	template<typename T>
	struct IsConst<const T>
	{
		enum { Value = true };
	};

	template<typename T>
	struct IsConst<const T&>
	{
		enum { Value = true };
	};

	template<typename T>
	struct IsConst<T* const>
	{
		enum { Value = true };
	};

	template<typename T>
	struct IsVoid
	{
		enum { Value = false };
	};

	template<>
	struct IsVoid<void>
	{
		enum { Value = true };
	};
}
